home *** CD-ROM | disk | FTP | other *** search
AMOS Source Code | 1994-04-12 | 12.9 KB | 568 lines |
- '
- ' Swarm - Mark Baker 10/4/94
- '
- '
- ' setup screen
- '
- Global SCX,SCY,RSCX,RSCY,XH,YH
- SCX=635
- If Ntsc
- SCY=200
- Else
- SCY=250
- End If
- XH=120
- YH=42
- RSCX=SCX+5
- RSCY=SCY+5
- Screen Open 0,RSCX,RSCY,2,Hires
- Screen Display 0,XH,YH,,
- Flash Off : Curs Off : Hide On
- Paper 0 : Pen 1 : Ink 1
- Palette 0,$FFF
- Change Mouse 4
- Cls
- Double Buffer
- Autoback 0
- Limit Mouse XH,YH To 320+XH,SCY+YH
- '
- ' set up variables
- Global FLIES,ACC#,SPEED#,BOUNCE_ON,BOUNCE#,DRW_METHOD,SWARM_METHOD
- Global CHANGE_ON,CHANGE_FREQ
- FLIES=5
- ACC#=1.0
- SPEED#=14.0
- BOUNCE_ON=1
- BOUNCE#=1.0
- DRW_METHOD=1
- SWARM_METHOD=0
- CHANGE_ON=0
- CHANGE_FREQ=50
- '
- ' Menu
- '
- MENU:
- Cls
- Show On : Colour 17,$FFF
- Reserve Zone 15
- Print At(35,1)+"S W A R M"
- Print At(25,3)+Zone$("Number of Flies :"+Str$(FLIES),1)
- Print At(25,4)+Zone$("Acceleration :"+Str$(ACC#),2)
- Print At(25,5)+Zone$("Maximum Velocity :"+Str$(SPEED#),3)
- If BOUNCE_ON
- Print At(25,6)+Zone$("Bouncy Walls",4)
- Print At(25,7)+Zone$("Bounce factor :"+Str$(BOUNCE#),5)
- Else
- Print At(25,6)+Zone$("Normal Walls",4)
- End If
- A$="Drawing Method : "
- If DRW_METHOD=0 Then A$=A$+"Dots"
- If DRW_METHOD=1 Then A$=A$+"Lines"
- If DRW_METHOD=2 Then A$=A$+"Polygon"
- Print At(25,8)+Zone$(A$,6)
- A$="Swarm Method : "
- If SWARM_METHOD=0 Then A$=A$+"all to mouse"
- If SWARM_METHOD=1 Then A$=A$+"to previous/mouse"
- If SWARM_METHOD=2 Then A$=A$+"random previous/mouse"
- If SWARM_METHOD=3 Then A$=A$+"all to previous"
- If SWARM_METHOD=4 Then A$=A$+"random targets"
- Print At(25,9)+Zone$(A$,7)
- If CHANGE_ON
- Print At(25,10)+Zone$("Flies change target",8)
- A$="Change Frequency : every "
- A$=A$+Str$(Abs(CHANGE_FREQ))+" frames"
- Print At(25,11)+Zone$(A$,9)
- Else
- Print At(25,10)+Zone$("Flies keep target",8)
- End If
- Print At(5,0)+Zone$("Quit",10)
- Print At(25,16)+Zone$("Start",13)
- Print At(25,13)+Zone$("Help",11)
- Print At(25,14)+Zone$("About",12)
- Print At(19,19)+Zone$("This program is VegeWare. (c) 1994 Mark Baker.",14)
- Print At(23,20)+Zone$("Click on Help or About for more info.",15)
- '
- Screen Swap : Wait Vbl
- Repeat : MZ=Mouse Zone : MC=Mouse Click : Until MC>0 and MZ>0
- '
- If MZ=1
- _SET["Number of flies",FLIES]
- FLIES=Param
- End If
- If MZ=2
- _SETF["Acceleration",ACC#]
- ACC#=Param#
- End If
- If MZ=3
- _SETF["Maximum velocity",SPEED#]
- SPEED#=Param#
- End If
- If MZ=4 Then BOUNCE_ON=1-BOUNCE_ON
- If MZ=5
- _SETF["Bounce factor",BOUNCE#]
- BOUNCE#=Param#
- End If
- If MZ=6 Then Add DRW_METHOD,1,0 To 2
- If MZ=7 Then Add SWARM_METHOD,1,0 To 4
- If MZ=8 Then CHANGE_ON=1-CHANGE_ON
- If MZ=9
- _SET["Change frequency",CHANGE_FREQ]
- CHANGE_FREQ=Param
- End If
- If MZ=10
- Fade 1
- Wait 20
- End
- End If
- If MZ=11 or MZ=15 Then HELP
- If MZ=12 or MZ=14 Then ABOUT
- If MZ=13
- Fade 1 : Wait 15
- Hide On
- Cls : Screen Swap : Wait Vbl
- Cls : Screen Swap : Wait Vbl
- If DRW_METHOD<2
- SWARM_1
- Else
- SWARM_2
- End If
- Cls : Screen Swap : Wait Vbl
- Cls : Screen Swap : Wait Vbl
- Palette ,$FFF
- End If
- Goto MENU
- '
- ' procedures
- '
- Procedure _SET[TXT$,CUR]
- Autoback 1
- For N=13 To 15
- Print At(25,N)+" "
- Next N
- Print At(25,16)+"Press mouse buttons to change value,"
- Print At(25,17)+"Press space key to accept value."
- Repeat
- If Mouse Key=1 Then Inc CUR
- If Mouse Key=2 Then Dec CUR
- If CUR<0 Then CUR=0
- Print At(25,14)+TXT$+Str$(CUR)+" "
- Wait Vbl : Wait 2
- Until Inkey$=" "
- Autoback 0
- End Proc[CUR]
- Procedure _SETF[TXT$,CUR#]
- Autoback 1
- For N=13 To 15
- Print At(25,N)+" "
- Next N
- Print At(25,16)+"Press mouse buttons to change value,"
- Print At(25,17)+"Press space key to accept value."
- T=CUR#*10
- Repeat
- If Mouse Key=1 Then Inc T
- If Mouse Key=2 Then Dec T
- If T<0 Then T=0
- Print At(25,14)+TXT$+Str$(T/10.0)+" "
- Wait Vbl : Wait 2
- Until Inkey$=" "
- Autoback 0
- CUR#=T/10.0
- End Proc[CUR#]
- Procedure HELP
- Cls
- Print At(35,1)+"H E L P"
- Print At(5,3)+"To change a value, click on it or the text preceeding it."
- Print At(5,4)+"This will toggle on/off values, or let you enter a value."
- Print At(5,6)+"To start the SWARM click on Start."
- Print At(5,8)+"To quit SWARM click on Quit."
- Print At(5,10)+"For more information, click on About."
- Print At(5,13)+"Click the mouse to return."
- Screen Swap : Wait Vbl
- Cls
- Repeat : Until Mouse Click
- End Proc
- Procedure ABOUT
- Cls
- Print At(35,1)+"A B O U T"
- Print
- Print " SWARM is a simulation of a swarm of insects (or a shoal of fish, I never"
- Print " decided which). The easiest way to see what I mean is to try it. Click"
- Print " the mouse once now, then click on Start to see what happens. Just click "
- Print " the mouse again to stop."
- Print
- Print " You can set the acceleration, maximum velocity, etc.. from the main "
- Print " screen. Just click on the value you want to change."
- Print
- Print " If you have a faster amiga (A1200, A4000) then try >30 flies. Poor saps "
- Print " like myself with A500s should stick to about 15 for smooth movement."
- Print
- Print " SWARM is VegeWare, which means if you like it then please send me a "
- Print " vegetarian recepie - I'm bored of vegieburgers! Feel free to send me "
- Print " anything... especially suggestions or your own programs. This program "
- Print " must not be distributed for profit, and that includes Coverdisks - get in"
- Print " touch with me if you want to use it on a coverdisk."
- Print " It may be included in collections such as Fred Fish's excellent "
- Print " contribution to the amiga communty. (Thanks Fred!)"
- Screen Swap : Wait Vbl
- Repeat : Until Mouse Click
- Cls
- Print At(35,1)+"A B O U T"
- Print
- Print " Here is my address: "
- Print
- Print " Mark Baker"
- Print " 51 Ladbroke Road"
- Print " Redhill"
- Print " Surrey"
- Print " RH1 1JU"
- Print " England"
- Print
- Print " Until August, my email address is: "
- Print
- Print " ukrbake@prl.philips.co.uk"
- Screen Swap : Wait Vbl
- Repeat : Until Mouse Click
- Cls
- End Proc
- Procedure SWARM_2
- Dec FLIES
- TX=0
- TY=0
- SCALE=2^15
- ACCEL=SCALE*ACC#
- MX2=SPEED#*SCALE
- MX1=-MX2
- MY2=MX2/2
- MY1=-MY2
- X Mouse=XH+(SCX/4)
- Y Mouse=YH+(SCY/2)
- If CHANGE_ON
- CHANGE=CHANGE_FREQ
- Else
- CHANGE=0
- End If
- '
- LPCOUNT=0
- Dim VX(FLIES),VY(FLIES)
- Dim AX(FLIES),AY(FLIES)
- Dim TARG(FLIES)
- For N=0 To FLIES
- AX(N)=Rnd(SCX)
- AY(N)=Rnd(SCY)
- Next N
- If SWARM_METHOD=0
- For N=0 To FLIES
- TARG(N)=-1
- Next N
- End If
- If SWARM_METHOD=1
- For N=0 To FLIES
- TARG(N)=N-1
- Next N
- End If
- If SWARM_METHOD=2
- TARG(0)=-1
- For N=1 To FLIES
- MX=N-1
- If MX=0
- TARG(N)=0
- Else
- TARG(N)=Rnd(N-1)
- End If
- If Rnd(2)=0
- TARG(N)=-1
- End If
- Next N
- End If
- If SWARM_METHOD=3
- For N=1 To FLIES
- TARG(N)=N-1
- Next N
- TARG(0)=FLIES
- End If
- If SWARM_METHOD=4
- For N=0 To FLIES
- Repeat
- TARG(N)=Rnd(FLIES)
- Until TARG(N)<>N
- Next N
- End If
- '
- Do
- For N=0 To FLIES
- TVX=VX(N)
- TVY=VY(N)
- If TARG(N)=-1
- TTX=TX
- TTY=TY
- Else
- TTX=AX(TARG(N))
- TTY=AY(TARG(N))
- End If
- Add TTX,-AX(N)
- CX=TTX*TTX
- Add TTY,-AY(N)
- CY=TTY*TTY
- T=CX
- Add T,CY
- If T=0
- CD=0
- Else
- CD=ACCEL/T
- If CD=0
- CD=1
- End If
- End If
- '
- T=CD*CX
- If TTX>0
- Add TVX,T
- Else
- Add TVX,-T
- End If
- '
- T=CD*CY
- If TTY>0
- Add TVY,T
- Else
- Add TVY,-T
- End If
- ' maximum velociy check
- If TVX>MX2 Then TVX=MX2 Else If TVX<MX1 Then TVX=MX1
- If TVY>MY2 Then TVY=MY2 Else If TVY<MY1 Then TVY=MY1
- '
- Add AX(N),TVX/SCALE
- Add AY(N),TVY/SCALE
- VX(N)=TVX
- VY(N)=TVY
- ' screen walls...
- If AX(N)>SCX
- AX(N)=SCX
- If BOUNCE_ON : VX(N)=-BOUNCE#*Abs(VX(N)) : End If
- Else
- If AX(N)<0
- AX(N)=0
- If BOUNCE_ON : VX(N)=BOUNCE#*Abs(VX(N)) : End If
- End If
- End If
- If AY(N)>SCY
- AY(N)=SCY
- If BOUNCE_ON : VY(N)=-BOUNCE#*Abs(VY(N)) : End If
- Else
- If AY(N)<0
- AY(N)=0
- If BOUNCE_ON : VY(N)=BOUNCE#*Abs(VY(N)) : End If
- End If
- End If
- Next N
- TX=X Screen(X Mouse)
- TY=Y Screen(Y Mouse)
- Ink 0 : Bar 0,0 To RSCX,RSCY
- Ink 1 : Plot TX,TY
- Gr Locate AX(1),AY(1)
- For N=1 To FLIES
- Draw To AX(N),AY(N)
- Next N
- Screen Swap : Wait Vbl
- '
- If Mouse Click Then Goto _END2
- If Timer>80
- C=6+Rnd(9)+16*(6+Rnd(9))+256*(6+Rnd(9))
- Fade 3,,C
- Timer=0
- End If
- If CHANGE_ON
- If LPCOUNT>CHANGE
- LPCOUNT=0
- N=Rnd(FLIES)
- Repeat
- T=Rnd(FLIES+1)-1
- Until N<>T
- TARG(N)=T
- End If
- Inc LPCOUNT
- End If
- Loop
- '
- _END2:
- Fade 1
- Wait 20
- Inc FLIES
- '
- End Proc
- Procedure SWARM_1
- Dec FLIES
- TX=0
- TY=0
- SCALE=2^15
- ACCEL=SCALE*ACC#
- MX2=SPEED#*SCALE
- MX1=-MX2
- MY2=MX2/2
- MY1=-MY2
- X Mouse=XH+(SCX/4)
- Y Mouse=YH+(SCY/2)
- If CHANGE_ON
- CHANGE=CHANGE_FREQ
- Else
- CHANGE=0
- End If
- '
- LPCOUNT=0
- Dim VX(FLIES),VY(FLIES)
- Dim AX(FLIES),AY(FLIES)
- Dim TARG(FLIES)
- Dim OX(FLIES),OY(FLIES)
- For N=0 To FLIES
- AX(N)=Rnd(SCX)
- AY(N)=Rnd(SCY)
- OX(N)=AX(N)
- OY(N)=AY(N)
- Next N
- If SWARM_METHOD=0
- For N=0 To FLIES
- TARG(N)=-1
- Next N
- End If
- If SWARM_METHOD=1
- For N=0 To FLIES
- TARG(N)=N-1
- Next N
- End If
- If SWARM_METHOD=2
- TARG(0)=-1
- For N=1 To FLIES
- MX=N-1
- If MX=0
- TARG(N)=0
- Else
- TARG(N)=Rnd(MX)
- End If
- If Rnd(2)=0
- TARG(N)=-1
- End If
- Next N
- End If
- If SWARM_METHOD=3
- For N=1 To FLIES
- TARG(N)=N-1
- Next N
- TARG(0)=FLIES
- End If
- If SWARM_METHOD=4
- For N=0 To FLIES
- Repeat
- TARG(N)=Rnd(FLIES)
- Until TARG(N)<>N
- Next N
- End If
- '
- Do
- For N=0 To FLIES
- TVX=VX(N)
- TVY=VY(N)
- If TARG(N)<0
- TTX=TX
- TTY=TY
- Else
- TTX=AX(TARG(N))
- TTY=AY(TARG(N))
- End If
- Add TTX,-AX(N)
- CX=TTX*TTX
- Add TTY,-AY(N)
- CY=TTY*TTY
- T=CX
- Add T,CY
- If T=0
- CD=0
- Else
- CD=ACCEL/T
- If CD=0
- CD=1
- End If
- End If
- '
- T=CD*CX
- If TTX>0
- Add TVX,T
- Else
- Add TVX,-T
- End If
- '
- T=CD*CY
- If TTY>0
- Add TVY,T
- Else
- Add TVY,-T
- End If
- ' maximum velociy check
- If TVX>MX2 Then TVX=MX2 Else If TVX<MX1 Then TVX=MX1
- If TVY>MY2 Then TVY=MY2 Else If TVY<MY1 Then TVY=MY1
- '
- Add AX(N),TVX/SCALE
- Add AY(N),TVY/SCALE
- VX(N)=TVX
- VY(N)=TVY
- ' screen walls...
- If AX(N)>SCX
- AX(N)=SCX
- If BOUNCE_ON : VX(N)=-BOUNCE#*Abs(VX(N)) : End If
- Else
- If AX(N)<0
- AX(N)=0
- If BOUNCE_ON : VX(N)=BOUNCE#*Abs(VX(N)) : End If
- End If
- End If
- If AY(N)>SCY
- AY(N)=SCY
- If BOUNCE_ON : VY(N)=-BOUNCE#*Abs(VY(N)) : End If
- Else
- If AY(N)<0
- AY(N)=0
- If BOUNCE_ON : VY(N)=BOUNCE#*Abs(VY(N)) : End If
- End If
- End If
- Next N
- TX=X Screen(X Mouse)
- TY=Y Screen(Y Mouse)
- Ink 0 : Bar 0,0 To RSCX,RSCY
- Ink 1 : Plot TX,TY
- If DRW_METHOD=0
- For N=0 To FLIES
- Plot AX(N),AY(N)
- Next N
- Else
- For N=0 To FLIES
- Draw OX(N),OY(N) To AX(N),AY(N)
- OX(N)=AX(N)
- OY(N)=AY(N)
- Next N
- End If
- Screen Swap : Wait Vbl
- '
- If Mouse Click Then Goto _END1
- If Timer>80
- C=6+Rnd(9)+16*(6+Rnd(9))+256*(6+Rnd(9))
- Fade 3,,C
- Timer=0
- End If
- If CHANGE_ON
- If LPCOUNT>CHANGE
- LPCOUNT=0
- N=Rnd(FLIES)
- Repeat
- T=Rnd((FLIES+1))-1
- Until N<>T
- TARG(N)=T
- End If
- Inc LPCOUNT
- End If
- Loop
- '
- _END1:
- Fade 1
- Wait 20
- Inc FLIES
- '
- End Proc